//
(function(window,document){
	//创建闭包
	var w = window,
		doc = document;
	var Kodo = function(selector){
		return new Kodo.prototype.init(selector);
	}
	Kodo.prototype = {
		constructor:Kodo,
		length : 0,
		splice:[].splice(),
		selector : '',
		init : function(selector){
			//dom选择的一些判断
			if(!selector){return this;}
			if(typeof selector == 'object'){
				for (var i = 0; i<selector.length; i++){
					this[i] = selector[i]
				}
				this.length = selector.length;
				return this;
			}else if(typeof selector =='function'){
				Kodo.ready(selector);	//执行载入函数，让函数在dom结构加载完毕之后执行， 而不是等资源加载完毕
				return;
			}
			var selector = selector.trim(),
				elem;
			if(selector.charAt(0)=="#" && selector.match('\\s')){	//charAt() 方法可返回指定位置的字符
				selector = selector.substring(1);	//substring() 方法用于提取字符串中介于两个指定下标之间的字符
				elem = document.getElementById(selector);//获取id为selector的元素
				
				this[0] = elem;
				this.length = 1;
				return this;
			}else{
				elem =document.querySelectorAll(selector);	//js原生匹配类css选择器的方法
				for(var i =0;i < elem.length; i++){
					this[i]=elem[i];
				}
				this.selector = selector;
				this.length = elem.length;
				return this;
			}
			
		},
		css : function (attr,val){ //链式测试
			console.log(this.length);
			for(var i = 0;i<this.length; i++){
				if(arguments.length == 1){
					return getComputedStyle(this[i],null)[attr];
				}
				this[i].style[attr] =val;
			}
			return this;
		},
		hasClass : function (cls){
			var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');	//定义一个正则表达式	^ 匹配字符串开始位置  $ 匹配字符串结束位置  |指明两项之间的一个选择
			for (var i = 0; i <this.length; i++){
				if(this[i].className.match(reg)) return true ;
				return false;
			}
			return this;
		},
		addClass : function(cls){
			var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
			for (var i = 0; i<this.length; i++){
				if(!this[i].className.match(reg)){
					this[i].className +=' ' +cls;
				}
			}
			return this
		},
		removeClass : function(cls){
			var reg = new RegExp('(\\s|^)' + cls +'(\\s|$)');
			for (var i =0;i<this.length;i++){
				this[i].className = this[i].className.replace(''+cls,'');
			}
			return this;
		},
		next:function(){	//下一个元素
			return sibling(this[0],"nextSibling")
		},
		prev:function(){	//上一个元素
			return sibling(this[0],"previousSibling")
		},
		parent:function(){
			var parent = this[0].parentNode;
			parent&&parent.nodeType !== 11 ?parent:null;
			var a = Kodo();
			a[0] = parent;
			a.selector = parent.tagName.toLocaleLowerCase();	//tagName 属性返回元素的标签名 (返回的是大写的字母)  toLocaleLowerCase() 方法用于把字符串转换为小写。
			a.length = 1;
			return a;
		}
	}
	Kodo.prototype.init.prototype = Kodo.prototype;
	String.prototype.trim=function(){return this.replace(/(^\s+)|(\s+$)/g,'')}//去除空格
	Kodo.ajax = function(){
		//直接挂载方法，可f.ajax调用
		console.log(this)
		alert(1)
	};
	Kodo.ready = function(fn){
		doc.addEventListener('DOMContentLoaded',function(){		//添加事件监听
		fn && fn();
		},false);
		doc.removeEventListener('DOMContentLoaded',fn,true);	//移除事件监听
	};
	Kodo.each = function(obj,callback){
		var len = obj.length,
			constru = obj.constructor,	// constructor 属性返回对创建此对象的数组函数的引用。 即对象的类型如 数组 布尔 字符串 日期等类型
			i =0;
		if(constru === window.f){
			for(i<len;i++){
				var val = callback.call(obj[i],i,obj[i]);
				if(val === false) break;
			}
		}else if(isArreay(obj)){
			for(i<len;i++){
				var val = callback.call(obj[i],[i],obj[i]);
				if(val === false) break;
			}
		}
	}
	w.f = Kodo;	//原型给全局对象下的f
	function sibling(cur,dir){	//过滤dom元素
		while ((cur = cur[dir]) && cur.nodeType !==1 ){}	//nodeType = 1 是元素节点
		return cur;
	};
	function isArray(obj){	//数组验证方法
		return Array.isArray(obj);
	}
})(window,document);
